다변수 가우시안 정규 분포 혹은 간단히 다변수 정규 분포(MVN: Multivariate Normal)는 복수의 확률 변수를 모형화하는데 가장 많이 사용되는 분포이다.
$D$차원 다변수 정규 분포의 확률 밀도 함수는 다음과 같다.
$$ \mathcal{N}(x \mid \mu, \Sigma) = \dfrac{1}{(2\pi)^{D/2} |\Sigma|^{1/2}} \exp \left( -\dfrac{1}{2} (x-\mu)^T \Sigma^{-1} (x-\mu) \right) $$이 식에서 각 기호는 다음을 의미한다.
공분산 벡터의 역행렬 $\Sigma^{-1}$는 precision matrix 혹은 concentration matrix 라고도 한다.
SciPy의 stats 서브패키지에는 다변수 정규 분포를 위한 multivariate_normal
클래스가 있다. mean
인수로 평균 벡터를, cov
인수로 공분산 행렬을 받는다.
2차원($D=2$) 다변수 정규 분포의 예를 몇가지 살펴보자.
우선 2차원이므로 확률 변수 벡터는 $$ x = \begin{bmatrix}x_1 \\ x_2 \end{bmatrix} $$ 이다.
만약
$$ \mu = \begin{bmatrix}2 \\ 3 \end{bmatrix}. \;\;\; \Sigma = \begin{bmatrix}1 & 0 \\ 0 & 1 \end{bmatrix} $$이면
$$ |\Sigma|^{1/2} = 1. \;\;\; \Sigma^{-1} = \begin{bmatrix}1 & 0 \\ 0 & 1 \end{bmatrix} $$$$ (x-\mu)^T \Sigma^{-1} (x-\mu) = \begin{bmatrix}x_1 - 2 & x_2 - 3 \end{bmatrix} \begin{bmatrix}1 & 0 \\ 0 & 1 \end{bmatrix} \begin{bmatrix}x_1 - 2 \\ x_2 - 3 \end{bmatrix} = (x_1 - 2)^2 + (x_2 - 3)^2 $$$$ \mathcal{N}(x_1, x_2) = \dfrac{1}{\sqrt{2\pi}} \exp \left( -\dfrac{1}{2} \left( (x_1 - 2)^2 + (x_2 - 3)^2 \right) \right) $$이 확률 밀도 함수의 모양은 다음과 같다.
In [16]:
mu = [2, 3]
cov = [[1, 0], [0, 1]]
rv = sp.stats.multivariate_normal(mu, cov)
xx = np.linspace(0, 4, 120)
yy = np.linspace(1, 5, 150)
XX, YY = np.meshgrid(xx, yy)
plt.grid(False)
plt.contourf(XX, YY, rv.pdf(np.dstack([XX, YY])))
plt.axis("equal")
plt.show()
만약
$$ \mu = \begin{bmatrix}2 \\ 3 \end{bmatrix}. \;\;\; \Sigma = \begin{bmatrix}2 & 3 \\ 3 & 7 \end{bmatrix} $$이면 $$ | \Sigma | = 5,\;\;\; \Sigma^{-1} = \begin{bmatrix}1.4 & -0.6 \\ -0.6 & 0.4 \end{bmatrix} $$
$$ (x-\mu)^T \Sigma^{-1} (x-\mu) = \begin{bmatrix}x_1 - 2 & x_2 - 3 \end{bmatrix} \begin{bmatrix}1.4 & -0.6 \\ -0.6 & 0.4\end{bmatrix} \begin{bmatrix}x_1 - 2 \\ x_2 - 3 \end{bmatrix} = \dfrac{1}{10}\left(14(x_1 - 2)^2 - 12(x_1 - 2)(x_2 - 3) + 4(x_2 - 3)^2\right) $$$$ \mathcal{N}(x_1, x_2) = \dfrac{1}{\sqrt{20\pi}} \exp \left( -\dfrac{1}{10}\left(7(x_1 - 2)^2 - 6(x_1 - 2)(x_2 - 3) + 2(x_2 - 3)^2\right) \right) $$이 확률 밀도 함수의 모양은 다음과 같다.
In [2]:
mu = [2, 3]
cov = [[2, 3], [3, 7]]
rv = sp.stats.multivariate_normal(mu, cov)
xx = np.linspace(0, 4, 120)
yy = np.linspace(1, 5, 150)
XX, YY = np.meshgrid(xx, yy)
plt.grid(False)
plt.contourf(XX, YY, rv.pdf(np.dstack([XX, YY])))
plt.axis("equal")
plt.show()
다변수 정규 분포를 모수에 대해 최적화하는 문제를 풀어보자. 어떤 함수에 로그를 취해도 최고점이나 최저점의 위치는 변하지 않기 때문에 문제를 쉽게 하기 위해 로그를 취한 분포함수를 최적화를 한다.
$$ \log \mathcal{N}(x|\mu, \Sigma) = -\dfrac{1}{2} \log|\Sigma| - \dfrac{1}{2} (x-\mu)^T \Sigma^{-1} (x-\mu) $$기호를 단순하게 하기 위해 precision matrix $\Sigma ^{-1} $를 $ \Lambda$ 로 표시한다.
$$ \dfrac{1}{2} f = \log \mathcal{N}(x|\mu, \Sigma) = \dfrac{1}{2} \log|\Lambda| - \dfrac{1}{2} (x-\mu)^T \Lambda (x-\mu) $$스칼라 함수 $f$ 를 평균 벡터 $\mu$로 미분하면 다음과 같다.
$$ \begin{eqnarray} \dfrac{\partial f}{\partial \mu} &=& \dfrac{\partial}{\partial \mu} \big( \log | \Lambda | \big) - \dfrac{\partial}{\partial \mu} \big( (x-\mu)^T \Lambda (x-\mu) \big) \\ &=& (\Lambda + \Lambda^T)(x-\mu) \\ &=& 0 \end{eqnarray} $$$$ \therefore \;\; \mu = x $$이번에는 두 개의 다변수 정규 분포 확률 변수 $X$, $Y$가 있을 경우를 생각해 보자. 두 확률 변수가 독립이며 모수 $\mu$, $\Lambda$가 같다고 가정하자.
이 때 로그 정규 분포는 다음과 같다.
$$ \begin{eqnarray} \dfrac{1}{2}f &=& \log \left( \mathcal{N}(x|\mu, \Sigma)\mathcal{N}(y|\mu, \Sigma)\right) \\ &=& \log \mathcal{N}(x|\mu, \Sigma) + \log \mathcal{N}(y|\mu, \Sigma) \\ &=& - \log|\Sigma| - \dfrac{1}{2} (x-\mu)^T \Lambda (x-\mu) - \dfrac{1}{2} (y-\mu)^T \Lambda (y-\mu) \end{eqnarray} $$이 함수 $f$를 평균 벡터 $\mu$와 precision matrix $\Lambda$ 로 미분하면 다음과 같다.
$$ \begin{eqnarray} \dfrac{\partial f}{\partial \mu} &=& \dfrac{\partial}{\partial \mu} \big( 2\log | \Lambda | \big) - \dfrac{\partial}{\partial \mu} \big( (x-\mu)^T \Lambda (x-\mu) \big) - \dfrac{\partial}{\partial \mu} \big( (y-\mu)^T \Lambda (y-\mu) \big) \\ &=& (\Lambda + \Lambda^T)(x-\mu) + (\Lambda + \Lambda^T)(y-\mu) \\ &=& 0 \end{eqnarray} $$$$ \therefore \;\; \mu = \dfrac{x + y}{2} $$$$ \begin{eqnarray} \dfrac{\partial f}{\partial \Lambda} &=& \dfrac{\partial}{\partial \Lambda} \big( 2\log | \Lambda | \big) - \dfrac{\partial}{\partial \Lambda} \big( (x-\mu)^T \Lambda (x-\mu) \big) - \dfrac{\partial}{\partial \Lambda} \big( (y-\mu)^T \Lambda (y-\mu) \big) \\ &=& (2\Lambda^{-1})^T - \dfrac{\partial}{\partial \Lambda} \left( \text{tr} \left( (x-\mu)(x-\mu)^T \Lambda \right) \right) - \dfrac{\partial}{\partial \Lambda} \left( \text{tr} \left( (y-\mu)(y-\mu)^T \Lambda \right) \right) \\ &=& 2\Sigma^T - ((x-\mu)(x-\mu)^T)^T - ((y-\mu)(y-\mu)^T)^T \\ &=& 0 \end{eqnarray} $$$$ \therefore \;\; \Sigma = \dfrac{1}{2} \left( (x-\mu)(x-\mu)^T + (y-\mu)(y-\mu)^T \right) $$